import express from 'express';
import multer from 'multer';
import cors from 'cors';
import path from 'node:path';
import fs from 'node:fs';

const storage = multer.diskStorage({        // 配置对象
    destination: function (req, file, cb) {
        // 指定上传文件的保存路径, 每个切片暂存的目录
        cb(null, 'uploads/')
    },
    filename: function (req, file, cb) {
        // 指定保存切片的文件名
        cb(null, `${req.body.index}-${req.body.name}`)    // 切片文件名,这边需要自定义的参数，但multer如果读到file对象 就不会读取后面的参数了
    }
})
// 第一步，初始化创建一个multer实例, multer是一个函数，接收一个配置对象作为参数
const upload = multer({ storage: storage })

const app = express();

app.use(cors());   // 解决跨域问题
app.use(express.json());

app.post('/upload', upload.single('file'), (req, res) => {  // 使用 multer 的实例 upload的single方式来接收文件对象，传的名称跟前端要对应
   
    res.send({ status: 'ok' })
})

app.post('/merge', (req, res) => {
    // 合并切片
    const uploadDir = path.join(process.cwd(), 'uploads')
    const dirs = fs.readdirSync(uploadDir)   // 读文件夹
    // 需要排序，原本顺序是按字符串字典顺序走的， 1 10 11 2 ...
    dirs.sort((a, b) => a.split('-')[0] - b.split('-')[0])   // 这样按前端传的索引顺序排了

    // 存储整文件的地址
    const filePath = path.join(process.cwd(), 'filestore', `${req.body.fileName}.${req.body.suffix}`)  // 名字 和 后缀类型 传过来
    // 合并
    dirs.forEach(item => {
        fs.appendFileSync(filePath, fs.readFileSync(path.join(uploadDir, item)))   // 读取文件，写入整文件 append
        // fs.unlinkSync(path.join(uploadDir, item))   // 删除文件 unlink
    })

    res.send({ status: 'ok' });
})


// 提供一个文件流下载
app.post('/download', (req, res) => {
    // 下载什么，让前端传过来
    const filePath = path.join(process.cwd(), 'static', `${req.body.fileName}.${req.body.suffix}`)  // 名字 和 后缀类型 传过来
    const fileContent = fs.readFileSync(filePath)   // 读取文件（Buffer 格式）  不能加第二个参数 'utf-8',否则就是字符串了
    // 这两个响应头是核心
    res.setHeader('Content-Type', 'application/octet-stream')  // 设置响应格式是 二进制流 octet-stream
    // 浏览器打开图片 默认是取预览 而不是下载，  Content-Dispositio 默认 inline 内联模式
    // 将值改为 attachment，告诉浏览器，将文件当做附件 进行下载，  filename是非必须的
    res.setHeader('Content-Disposition', `attachment; filename=${req.body.fileName}.${req.body.suffix}`)  
    res.send(fileContent)   // 发送文件
})

app.listen(3000, () => {
    console.log('Server is running on port 3000');
})

